#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include "serializable.hpp"

int main() {
  int sock;
  struct sockaddr_in addr;
  char buf[1024];
  char message[1024];
  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    perror("socket");
    return errno;
  }
  bzero(&addr, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_port = htons(8888);
  #define SERVER_ADDR "127.0.0.1"
  addr.sin_addr.s_addr = inet_addr(SERVER_ADDR);
  if (connect(sock, (struct sockaddr *)&addr, 
              sizeof(addr)) < 0) {
    perror("connect");
    return errno;
  }
  A a(100);
  B b(200);
  C c(300);
  send(sock, a.serialize().c_str(), sizeof(a.serialize().c_str()), 0);
  recv(sock, buf, sizeof(a.serialize().c_str()), 0);
  std::cout << buf << std::endl;
  send(sock, b.serialize().c_str(), sizeof(b.serialize().c_str()), 0);
  recv(sock, buf, sizeof(b.serialize().c_str()), 0);
  std::cout << buf << std::endl;
  send(sock, c.serialize().c_str(), sizeof(c.serialize().c_str()), 0);
  recv(sock, buf, sizeof(c.serialize().c_str()), 0);
  std::cout << buf << std::endl;
  close(sock);
  return 0;
}
